<?php

namespace App\Http\Controllers\Site\User;

use App\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
//    退出登陆可以做一个中间件认证
    public function __construct()
    {
        //只有退出登陆的时候需要验证用户是否登陆了
        $this->middleware('user')->only('logout');
    }

    /**
     *login方法用来展示用户登陆页面
     */
    public function login()
    {
        return view('site.user.login');
    }

    /**
     *
     * @return \Illuminate\Http\Response
     */
    public function denglu(Request $request)
    {
        //直接验证用户传递过来的用户名密码是否正确
        $result = auth()->attempt([
            'email' => \request('email'),
            'password' => \request('password'),
        ]);

        if ($result) {
            //进入这个方法体说明登陆正常
            return redirect(route('site.index'))->with('success', '登陆成功');
        }
        return back()->with('error', '登陆失败');
    }

    //展示用户注册页面的方法
    public function register()
    {
        return view('site.user.register');
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request, User $user)
    {
        //对请求的注册数据进行验证
        $request->validate([
//            前台已经通过js验证过邮箱和密码不能为空,所以在后台这里可以不同再验证
            'email' => 'required|email|unique:users',
            //required验证相应字段必须存在于输入数据中，而且不能为空。null,空字符串,空数组 都是空
            'password' => 'required|confirmed'
        ], [
            'email.required' => '邮箱不能为空',
            'email.email' => '邮箱格式不对',
            'email.unique' => '邮箱已经注册过',
            'password.required' => '密码不能为空',
            'password.confirmed' => '两次密码不一致',
        ]);
        //上面的验证通过以后,接着需要判断用户输入的验证码和邮箱是不是和发送的验证码一致
        //这里使用&&语句,只有&&前后的判断条件都为真的时候才为true,否则为false,然后将判断结果返回给$rule
        //session() 函数可以用来获取或者设置 Session 中的值
        //你可以通过将一组键/值对传递给该函数来设置值  例如:session(['chairs' => 7, 'instruments' => 3]);
        //如果没有传递值给session()函数，则返回 Session 实例：
        $status = session('register.email') == $request->input('email') &&
            session('register.code') == $request->input('code');
        if (!$status) {
            return back()->with('error', '验证码错误或者邮箱不一致');
        }
//        通过上面的验证后就可以向用户表中存放数据了
        $user['email'] = $request['email'];
        $user['password'] = bcrypt(request('password'));
        $user['name'] = '只为当为';
        $user->save();
        return redirect(route('user.login'))->with('success', '用户注册成功');
    }

    //用户退出登陆方法,不需要传递参数,直接通过auth()调用当前用户的logout()方法就行,因为你只能自己退自己,
    public function logout()
    {
//        auth 函数返回一个 认证 实例。为了方便起见，你可以使用它来替代 Auth Facade
        //退出的时候直接调用认证实例的logout()方法就可以
        auth()->logout();
        return redirect(route('site.index'))->with('success', '退出成功');
    }

    //前台用户修改密码控制器方法
    public function showEditPasswordView()
    {
        //渲染修改用户密码的视图模板
        return view('site.user.edit_password');
    }

    //这个方法真正用来处理修改密码的业务逻辑
    public function editPassword(Request $request, User $user)
    {
        //由于前台已经通过js验证了邮箱格式,是否输入的问题,所以这里可以直接进行判断
        //首先判断通过表单传递过来的email和发送验证码的email是否一致,以及验证码是否正确
        $sessionEmail = session('register.email');
        $sessionCode = session('register.code');
        //由于session中存储的register.code是数字类型,而通过request请求获取到的code是string类型,所以需要进行下类型转换
        if ($sessionEmail !== $request['email'] || $sessionCode !== (int)$request['code']) {
            //先将请求的数据进行闪存
            $request->flash();
            return back()->with('error', '邮箱不一致或者验证码输入错误!');
        }
        //接着判断用户给的邮箱是否注册过了,也就是通过邮箱查询相应的模型对象是否存在
        if (!$user->where('email', $request['email'])->exists()) {
            //进入这个判断体说明发送过来的邮箱并没有注册
            //可以在这里使用flash闪存将将本次请求的数据保留到下一次请求发送前,这样前台就可以通过全局辅助函数old()获取上次表单请求的数据了
            //如果你使用了 Laravel 的 验证功能，你就不需要在手动实现这些方法，因为 Laravel 内置的验证工具会自动调用他们。
            $request->flash();
            return back()->with('error', '输入的邮箱还没有注册,请用注册邮箱修改密码!');
        }
        //通过上面的验证后说明输入的邮箱已经注册过,现在只需要验证下用户输入的密码是否一致就可以了
        $request->validate([
            'password' => 'required|confirmed'
        ], [
            'password.required' => '密码不能为空',
            'password.confirmed' => '输入的密码不一致'
        ]);
        //进入到这一步说明验证已经完成,可以进行修改密码的操作了
        $user->where('email',$request['email'])->update(['password'=>bcrypt($request['password'])]);
        //执行到这里说明密码已经更改完成,可以跳转到登陆页面了
        return redirect(route('user.login'))->with('success','密码修改成功,又可以登陆了!');
    }

}
